home *** CD-ROM | disk | FTP | other *** search
/ Shareware Grab Bag / Shareware Grab Bag.iso / 007 / pctrace.arc / PCTRACE.ASM next >
Encoding:
Assembly Source File  |  1986-07-03  |  21.1 KB  |  815 lines

  1.     PAGE    60,132
  2.     TITLE    PTRACE internal DOS Trace
  3.     COMMENT * DJOHNSON 07/21/85 *
  4.  
  5. ;
  6. ; PTRACE adds an internal trace table to PC DOS. You must be running
  7. ; DOS 2.0 or later to use it. This routine, PTRACE, loads itself
  8. ; into memory, steals software interrupt vectors, and then terminates
  9. ; and stays resident. After that, all DOS INT 21H, INT 13H(diskette),
  10. ; and printer INT 17H calls are recorded in the circular trace buffer
  11. ; maintained by this program. The trace table may be displayed by
  12. ; invoking the PCT command.
  13. ;
  14. ; Dick Johnson SLA
  15. ;
  16. ;
  17. ;
  18. ;            DISCLAIMER NOTICE
  19. ;
  20. ;  This  document and/or  portions  of    the material  and  data
  21. ;  furnished herewith,    was developed  under sponsorship of the
  22. ;  U.S.  Government.  Neither the U.S.    nor the U.S.D.O.E., nor
  23. ;  the Leland Stanford Junior University,  nor their employees,
  24. ;  nor their respective contractors,  subcontractors,  or their
  25. ;  employees,    makes any  warranty,  express  or implied,   or
  26. ;  assumes  any  liability  or     responsibility  for  accuracy,
  27. ;  completeness or  usefulness of any  information,  apparatus,
  28. ;  product or  process disclosed,  or  represents that    its use
  29. ;  will not  infringe privately-owned  rights.    Mention  of any
  30. ;  product, its manufacturer, or suppliers shall not, nor is it
  31. ;  intended to, imply approval, disapproval, or fitness for any
  32. ;  particular use.   The U.S.  and  the University at all times
  33. ;  retain the right to use and disseminate same for any purpose
  34. ;  whatsoever.
  35. ;
  36. ;
  37. ;================================================================
  38. CSEG     SEGMENT PARA
  39. ;
  40. START     PROC     FAR               ;Main Procedure
  41. ;
  42. ;================================================================
  43. ASSUME CS:CSEG,DS:CSEG,SS:CSEG,ES:NOTHING
  44. ;================================================================
  45. ; MACRO DEFINITIONS
  46. STEAL     MACRO     N         ; STEAL INT N
  47.      MOV     INTNUM,N
  48.      MOV     AL,INTNUM   ; ASK DOS FOR CURRENT VECTOR
  49.      MOV     AH,035H
  50.      INT     DOSINT      ; ANSWER IN ES:BX
  51.      MOV     OLDIP&N,BX  ; SAVE OLD IP VALUE
  52.      MOV     AX,ES         ; AND OLD ES VALUE
  53.      MOV     OLDCS&N,AX  ; ...
  54. ;
  55.      LEA     DX,INTEXIT&N  ; NOW SET INTERRUPT VECTOR
  56.      MOV     AL,INTNUM   ; VIA DOS CALL
  57.      MOV     AH,025H
  58.      INT     DOSINT      ; NEW VECTOR IS DS:DX
  59. ;
  60.      JMP     CONT&N      ; JMP AROUND THE EXIT ITSELF
  61. INTEXIT&N: PUSHF         ; SAVE STATE OF FLAGS
  62.      INC     CS:COUNT&N  ; COUNT THIS INT
  63.      MOV     CS:INTNUM,N ; SET INT NUMBER
  64.      PUSH     AX         ; REG SAVE
  65.      MOV     AX,CS:OLDIP&N ; SET UP FOR RETURN LATER
  66.      MOV     CS:OLDIP,AX ; ...
  67.      MOV     AX,CS:OLDCS&N ; ...
  68.      MOV     CS:OLDCS,AX ; ...
  69.      POP     AX         ; RESTORE REG
  70.      JMP     INTEXIT     ; JOIN COMMON EXIT
  71. OLDIP&N  DW     ?         ; PREVIOUS IP
  72. OLDCS&N  DW     ?         ; PREVIOUS CS
  73. COUNT&N  DW     0         ; COUNT FOR THIS INT
  74. CONT&N:  NOP             ; CONTINUE
  75.      ENDM
  76. ;
  77. BLANKS     MACRO     A,N
  78. ;; MOVE 'N' BLANKS TO AREA 'A'
  79.      CLD            ; SET FORWARD DIRECTION
  80.      PUSH     DS        ; MAKE ES=DS
  81.      POP     ES
  82.      LEA     DI,A        ; A=DESTINATION
  83.      MOV     AL,20H     ; BLANK IN AL
  84.      IFNB     <&N>
  85.      MOV     CX,N        ; LENGTH TO SET
  86.      ELSE
  87.      MOV     CX,LENGTH A
  88.      ENDIF
  89. REP     STOSB            ; MOVE THE BLANKS
  90.      ENDM
  91. MVCLIT     MACRO     A,B,N
  92.      LOCAL     SKIP,DATA
  93. ;; MOVE LITERAL B TO AREA A WITH LENGTH N.
  94.      CLD            ; SET FORWARD DIRECTION
  95.      PUSH     DS        ; MAKE ES=DS
  96.      POP     ES
  97.      LEA     DI,A        ; A=DESTINATION
  98.      JMP     SKIP        ; JUMP AROUND LITERAL
  99. DATA     DB     B        ; LITERAL
  100. SKIP:     LEA     SI,DATA    ; MOVE FROM LITERAL
  101.      IFNB     <&N>
  102.      MOV     CX,N        ; LENGTH TO MOVE
  103.      ELSE
  104.      MOV     CX,LENGTH A
  105.      ENDIF
  106. REP     MOVSB            ; MOVE A->B (N CHARACTERS)
  107.      ENDM
  108. MVC     MACRO     A,B,N
  109. ;; MOVE STRING B TO AREA A WITH LENGTH N.
  110.      CLD            ; SET FORWARD DIRECTION
  111.      PUSH     DS        ; MAKE ES=DS
  112.      POP     ES
  113.      LEA     DI,A        ; A=DESTINATION
  114.      IFNB     <&B>
  115.      LEA     SI,B        ; MOVE FROM B
  116.      ENDIF
  117.      IFNB     <&N>
  118.      MOV     CX,N        ; LENGTH TO MOVE
  119.      ELSE
  120.      MOV     CX,LENGTH A
  121.      ENDIF
  122. REP     MOVSB            ; MOVE A->B (N CHARACTERS)
  123.      ENDM
  124. MASCIIZ  MACRO     A,S1,R1,N
  125.      LOCAL     CLOOP,CLOOPX
  126. ;; MOVE ASCIIZ STRING S1:R1 INTO A.
  127. ;; STOP WHEN LENGTH N REACHED OR ON '00'X IN DATA
  128.      MOV     AX,CALL&S1 ; SET ES FOR MOVE
  129.      MOV     ES,AX
  130.      MOV     SI,CALL&R1 ; SET SI FOR MOVE
  131.      MOV     CX,N        ; SET MAX MOVE LENGTH
  132.      LEA     DI,A        ; POINT TO DESTINATION
  133. CLOOP:     MOV     AL,BYTE PTR ES:[SI] ; NEXT CHAR IN AL
  134.      INC     SI
  135.      CMP     AL,0        ; IS IT A NULL?
  136.      JE     CLOOPX     ; YES, EXIT
  137.      MOV     BYTE PTR [DI],AL ; NO, STORE IT
  138.      INC     DI
  139.      LOOP     CLOOP        ; GET NEXT CHARACTER
  140. CLOOPX:  NOP
  141.      ENDM
  142. ;
  143. ;
  144.      ORG     100H        ; THIS IS A .COM FILE
  145. BEGCODE: JMP     CODE_START ; JMP AROUND DATA AREA
  146. ;
  147. ;================================================================
  148. ;
  149. ; DATA and STACK areas
  150. ;
  151. ;================================================================
  152.      DB     64 DUP('**Stack*')
  153. BEGSTACK DB     ?
  154. INTNUM     DB     ?         ; INT to be intercepted
  155. BFOUR     DB     4         ; CONSTANT 4
  156. SIGNON     DB     'PTRACE loaded at '
  157. LOADCS     DB     '1234'
  158.      DB     ':'
  159. LOADIP     DB     '5678'
  160.      DB     0AH,0DH,'$'
  161. SIGNOFF  DB     'PTRACE is already active'
  162.      DB     0AH,0DH,'$'
  163. ;
  164. YES     DB     'Y'
  165. NO     DB     'N'
  166. TFLAG     DB     'Y'        ; CONTROLS STORING OF TRACE ENTRIES
  167. WRAP     DB     'N'        ; HAS TRACE TABLE WRAPPED YET?
  168. POINT     DW     ?        ; TRACE TABLE POINTER
  169. OPTR     DW     ?        ; USED WHEN TYPING TRACE TABLE
  170. ;
  171. ; DEFINITION OF A SINGLE TRACE ENTRY
  172. ;
  173. TCS     DB     '1234'     ; CALLER CS
  174.      DB     ':'
  175. TIP     DB     '5678'     ; CALLER IP
  176. TCINT     DB     ' INT '
  177. LBLIP     EQU     $-TCS-1    ; WHERE TO PUT BLIP CHAR
  178. TINT     DB     '00'       ; INT NUMBER
  179.      DB     ' '
  180. TDESC     DB     8 DUP('?')
  181.      DB     ' '
  182. TCHARS     DB     'AX='
  183. TAX     DB     'AXAX'
  184.      DB     ' '
  185. TTEXT     DB     'BX='
  186. TBX     DB     'BXBX'
  187.      DB     ' CX='
  188. TCX     DB     'CXCX'
  189.      DB     ' '
  190. TXTWFD     DB     'DX='
  191. TDX     DB     'DXDX'
  192.      DB     ' DS='
  193. TDS     DB     'DSDS'
  194.      DB     ' ES='
  195. TES     DB     'ESES'
  196. LL     EQU     $-TCS        ; LENGTH OF AN ENTRY
  197. LCHARS     EQU     $-TCHARS   ; LENGTH OF MASK AREA
  198. LTEXT     EQU     $-TTEXT    ; LENGTH OF TEXT AREA
  199. LWFD     EQU     $-TXTWFD   ; LENGTH OF 40H TEXT AREA
  200. ;
  201. TMASK     DB     'AX='      ; MASK FOR AN ENTRY
  202.      DB     'AXAX'
  203.      DB     ' BX='
  204.      DB     'BXBX'
  205.      DB     ' CX='
  206.      DB     'CXCX'
  207.      DB     ' DX='
  208.      DB     'DXDX'
  209.      DB     ' DS='
  210.      DB     'DSDS'
  211.      DB     ' ES='
  212.      DB     'ESES'
  213. ;
  214. DMASK     DB     'FN='      ; MASK FOR INT 13H ENTRY
  215.      DB     'AXAX'
  216.      DB     ' BX='
  217.      DB     'BXBX'
  218.      DB     ' TS='
  219.      DB     'CXCX'
  220.      DB     ' HD='
  221.      DB     'DXDX'
  222.      DB     ' DS='
  223.      DB     'DSDS'
  224.      DB     ' ES='
  225.      DB     'ESES'
  226. ;
  227. ; TRACE LINE OUTPUT BUFFER
  228. ;
  229. OCS     DB     LL DUP(' ')
  230.      DB     0AH,0DH    ; CR/LF
  231. ;
  232.      DB     '>BEG>'    ; eyecatcher
  233. BEGTRACE LABEL     BYTE        ; START OF TRACE TABLE
  234.      DB     600 DUP (LL DUP(' '))
  235. ENDTRACE DB     '<END<'
  236. OUTINT     EQU     7FH        ; INT TO PRODUCE OUTPUT
  237. DOSINT     EQU     21H        ; DOS FUNCTION CALL INT
  238. ; DOS FUNCTIONS THAT POINT AT ASCIIZ WITH DS:DX
  239. LSTASC     DB     09H,39H,3AH,3BH,3CH,3DH,41H,43H,4BH
  240.      DB     4EH,4FH,56H,5AH,5BH
  241. LLSTASC  EQU     $-LSTASC
  242. ; DOS FUNCTIONS THAT POINT AT AN FCB VIA DS:DX
  243. LSTFCB     DB     0FH,10H,11H,12H,13H,14H,15H,16H,17H
  244.      DB     21H,22H,23H,24H,27H,28H
  245. LLSTFCB  EQU     $-LSTFCB
  246. ; DOS FUNCTIONS THAT OUTPUT A CHAR IN DL
  247. LSTCDL     DB     02H,04H,05H,06H
  248. LLSTCDL  EQU     $-LSTCDL
  249. ;
  250. DSKTAB     DB     00H,'DSK RST ' ; DISKETTE FUNCTIONS
  251.      DB     01H,'DSK STAT'
  252.      DB     02H,'DSK READ'
  253.      DB     03H,'DSK WRIT'
  254.      DB     04H,'DSK VERF'
  255.      DB     05H,'DSK FMT '
  256.      DB     9 DUP(0FFH)      ; END OF TABLE
  257. DOSTAB     DB     00H,'PGM TERM' ; DOS FUNCTION DESCRIPTIONS
  258. LDT     EQU     $-DOSTAB    ; length of an entry
  259.      DB     01H,'KBD INPT'
  260.      DB     02H,'DISP OUT'
  261.      DB     03H,'AUX INPT'
  262.      DB     04H,'AUX OUT '
  263.      DB     05H,'PRT OUT '
  264.      DB     06H,'CON ECHO'
  265.      DB     07H,'CON READ'
  266.      DB     08H,'CON-ECHO'
  267.      DB     09H,'PRT STRG'
  268.      DB     0AH,'KBD BUFD'
  269.      DB     0BH,'CHK INPT'
  270.      DB     0CH,'CLR&READ'
  271.      DB     0DH,'DISK RST'
  272.      DB     0EH,'SEL DISK'
  273.      DB     0FH,'OPENFILE'
  274.      DB     10H,'CLOSFILE'
  275.      DB     11H,'SRCHFRST'
  276.      DB     12H,'SRCHNEXT'
  277.      DB     13H,'DELTFILE'
  278.      DB     14H,'SEQ READ'
  279.      DB     15H,'SEQ WRIT'
  280.      DB     16H,'CREATE  '
  281.      DB     17H,'RENAME  '
  282.      DB     19H,'CUR DISK'
  283.      DB     1AH,'SET DTA '
  284.      DB     1BH,'ALLOINFO'
  285.      DB     1CH,'ALLODRV '
  286.      DB     21H,'RND READ'
  287.      DB     22H,'RND WRIT'
  288.      DB     23H,'FILESIZE'
  289.      DB     24H,'SET RNDF'
  290.      DB     25H,'SET VECT'
  291.      DB     26H,'PGM SEGM'
  292.      DB     27H,'RNDBREAD'
  293.      DB     28H,'RNDBWRIT'
  294.      DB     29H,'PARSENAM'
  295.      DB     2AH,'GET DATE'
  296.      DB     2BH,'SET DATE'
  297.      DB     2CH,'GET TIME'
  298.      DB     2DH,'SET TIME'
  299.      DB     2EH,'VER SWCH'
  300.      DB     2FH,'GET DTA '
  301.      DB     30H,'DOS VER '
  302.      DB     31H,'TERMKEEP'
  303.      DB     33H,'CTLBRKCH'
  304.      DB     35H,'GET VECT'
  305.      DB     36H,'DISK SPC'
  306.      DB     38H,'CNTRINFO'
  307.      DB     39H,'MKDIR   '
  308.      DB     3AH,'RMDIR   '
  309.      DB     3BH,'CHDIR   '
  310.      DB     3CH,'CREAT   '
  311.      DB     3DH,'OPENFILE'
  312.      DB     3EH,'CLOSHAND'
  313.      DB     3FH,'RDFILDEV'
  314.      DB     40H,'WRFILDEV'
  315.      DB     41H,'UNLINK  '
  316.      DB     42H,'LSEEK   '
  317.      DB     43H,'CHMOD   '
  318.      DB     44H,'IOCTL   '
  319.      DB     45H,'DUP HAND'
  320.      DB     46H,'FORCEDUP'
  321.      DB     47H,'GET DIR '
  322.      DB     48H,'GET MEM '
  323.      DB     49H,'FREE MEM'
  324.      DB     4AH,'SETBLOCK'
  325.      DB     4BH,'EXEC PGM'
  326.      DB     4CH,'EXIT RC '
  327.      DB     4DH,'GET RC  '
  328.      DB     4EH,'FINDFRST'
  329.      DB     4FH,'FINDNEXT'
  330.      DB     54H,'VERSTATE'
  331.      DB     56H,'RENAMEF '
  332.      DB     57H,'FILE TOD'
  333.      DB     59H,'GETEXERR'
  334.      DB     5AH,'TEMPFILE'
  335.      DB     5BH,'CREATNEW'
  336.      DB     5CH,'LOCKUNLK'
  337.      DB     62H,'GET PSP '
  338.      DB     9 DUP(0FFH)      ; END OF TABLE
  339. ;================================================================
  340. ;
  341. CODE_START:
  342. ; BASIC INITIALIZATION STUFF
  343.      MOV     AX,CS         ; FIX UP DS
  344.      MOV     DS,AX         ; ...
  345.      MOV     SS,AX         ; AND SS ALSO
  346.      LEA     AX,BEGSTACK ; SET SP
  347.      MOV     SP,AX         ; ...
  348. ;
  349.      MOV     AL,OUTINT   ; TRACING ALREADY ACTIVE?
  350.      MOV     AH,35H      ; GET CURRENT VECTOR
  351.      INT     DOSINT
  352.      MOV     AX,ES         ; POINT ANYWHERE?
  353.      CMP     AX,0
  354.      JE     TSTART
  355.      CMP     BX,0
  356.      JE     TSTART
  357. ;
  358.      LEA     DX,SIGNOFF  ; TYPE ABORT MESSAGE
  359.      MOV     AH,9
  360.      INT     DOSINT
  361.      MOV     AL,16         ; SET NON-ZERO RC
  362.      MOV     AH,4CH      ; TERMINATE PROCESS
  363.      INT     DOSINT
  364. ;
  365. TSTART:  LEA     AX,BEGTRACE ; INIT TRACE TABLE POINTER
  366.      MOV     POINT,AX
  367.      MOV     AL,YES      ; TURN ON TRACING
  368.      MOV     TFLAG,AL
  369.      MOV     AL,NO         ; NOT WRAPPED YET
  370.      MOV     WRAP,AL
  371. ;
  372.      MOV     AX,CS         ; CONVERT LOAD ADDR FOR PRINTING
  373.      LEA     SI,LOADCS
  374.      CALL     HEXPRT
  375.      MOV     AX,100H
  376.      LEA     SI,LOADIP
  377.      CALL     HEXPRT
  378. ;
  379.      LEA     DX,SIGNON   ; TYPE SIGNON MESSAGE
  380.      MOV     AH,9
  381.      INT     DOSINT
  382. ;
  383. ; SET INT FOR PRODUCING OUTPUT
  384. ;
  385.      LEA     DX,OUTPUT   ; ADDRESS OF ROUTINE
  386.      MOV     AL,OUTINT   ; INT NUMBER
  387.      MOV     AH,25H      ; SET INTERRUPT VECTOR
  388.      INT     DOSINT      ; HAVE DOS PLACE IT
  389. ;
  390. ; Set INT intercepts
  391. ;
  392.      STEAL     13H         ; DISKETTE I/O CALL
  393.      STEAL     17H         ; PRINTER    I/O CALL
  394.      STEAL     DOSINT      ; DOS FUNCTIONS
  395. ;
  396. ; NOW RETURN TO DOS WITH INTERCEPT IN PLACE
  397. ;
  398.      LEA     DX,ENDOFME  ; DX=LAST ADDR+1
  399.      INT     27H         ; TERMINATE AND STAY RESIDENT
  400. ;
  401. ; OUTPUT TRACE TABLE TO SCREEN
  402. ; WHEN WE GET AN INT CALL
  403. ;
  404. OUTPUT:
  405.      PUSH     AX         ; SAVE REGS
  406.      PUSH     BX
  407.      PUSH     CX
  408.      PUSH     DX
  409.      PUSH     ES
  410.      PUSH     DS
  411.      MOV     AX,CS         ; SET DS=CS
  412.      MOV     DS,AX
  413.      MOV     AL,NO         ; TURN OFF TRACING FOR NOW
  414.      MOV     TFLAG,AL
  415.      LEA     SI,BEGTRACE ; POINT AT START OF THINGS TO TYPE OUT
  416.      MOV     AL,WRAP     ; WRAP YET?
  417.      CMP     AL,NO         ; NO, CONTINUE
  418.      JE     NOWRAP
  419.      MOV     SI,POINT    ; YES, POINT TO OLDEST ENTRY
  420. NOWRAP:  NOP
  421. TLOOP:     LEA     DI,OCS      ; POINT TO OUTPUT BUFFER
  422.      MOV     OPTR,SI     ; SAVE CURRENT OUTPUT POINTER
  423.      MOV     AX,DS         ; MAKE ES=DS
  424.      MOV     ES,AX
  425.      MOV     CX,LL         ; LENGTH OF AN ENTRY
  426. REP     MOVSB             ; MOVE ENTRY TO BUFFER
  427. ;
  428.      MOV     CX,LL         ; MAKE IT PRINTABLE
  429.      LEA     SI,OCS
  430. XLAT:     MOV     AL,BYTE PTR [SI]
  431.      CMP     AL,31         ; LESS THAN BLANK?
  432.      JNLE     XLAT2
  433. XLATF:     MOV     BYTE PTR [SI],64 ; '@'
  434.      JMP     XLATN
  435. XLAT2:     CMP     AL,127      ; IN ASCII RANGE?
  436.      JA     XLATF
  437. XLATN:     INC     SI
  438.      LOOP     XLAT
  439. ;
  440.      LEA     DX,OCS      ; TYPE OUT BUFFER
  441.      MOV     BX,1         ; STANDARD OUTPUT
  442.      MOV     CX,LL         ; TRACE ENTRY LENGTH
  443.      INC     CX         ; LENGTH OF CRLF
  444.      INC     CX
  445.      MOV     AH,40H      ; WRITE FILE/DEVICE
  446.      INT     DOSINT      ; ...
  447. ;
  448.      MOV     AX,OPTR     ; NOW ADVANCE POINTER IN TABLE
  449.      ADD     AX,LL         ; BY LENGTH OF AN ENTRY
  450.      MOV     SI,AX         ; PLACE IN SOURCE POINTER REG
  451.      LEA     BX,ENDTRACE ; AT END OF TABLE YET?
  452.      CMP     SI,BX         ; ...
  453.      JE     SETTOP      ; YES, POINT BACK TO TOP
  454.      JMP     ETEST
  455. SETTOP:  LEA     AX,BEGTRACE ; POINT BACK TO TOP OF TRACE TABLE
  456.      MOV     SI,AX
  457. ETEST:     CMP     SI,POINT    ; DONE YET?
  458.      JE     OUTPUTX     ; YES, EXIT
  459.      JMP     TLOOP         ; NO, NEXT ENTRY TYPED OUT
  460. OUTPUTX: MOV     AL,YES      ; TURN TRACING BACK ON
  461.      MOV     TFLAG,AL
  462.      POP     DS
  463.      POP     ES         ; RESTORE REGS
  464.      POP     DX
  465.      POP     CX
  466.      POP     BX
  467.      POP     AX
  468.      IRET             ; RETURN FROM INT
  469. ;
  470. START     ENDP
  471. DUMMY     PROC     FAR
  472. ;
  473. ; COMMON INTERCEPT FOR ALL INTS WE STEAL
  474. ;
  475. INTEXIT:
  476.      MOV     CS:CALLAX,AX ; CALLER REGS TO DISPLAY
  477.      MOV     CS:CALLBX,BX
  478.      MOV     CS:CALLCX,CX
  479.      MOV     CS:CALLDX,DX
  480.      MOV     CS:CALLSI,SI
  481.      MOV     CS:CALLDI,DI
  482.      PUSH     DS         ; SAVE REGS
  483.      PUSH     ES
  484.      PUSH     BP
  485.      PUSH     AX
  486.      MOV     AX,DS
  487.      MOV     CS:CALLDS,AX
  488.      MOV     AX,ES
  489.      MOV     CS:CALLES,AX
  490.      PUSH     BX
  491.      PUSH     CX
  492.      PUSH     DX
  493.      PUSH     SI
  494.      PUSH     DI
  495.      MOV     BP,SP
  496.      MOV     AX,CS
  497.      MOV     DS,AX         ; MAKE DS=CS
  498. ;
  499.      STI             ; ALLOW HARDWARE INTERRUPTS
  500. ;
  501.      MOV     AX,[BP+22]
  502.      MOV     CALLCS,AX   ; CS WE WERE CALLED FROM
  503.      MOV     AX,[BP+20]
  504.      MOV     CALLIP,AX   ; IP WE WERE CALLED FROM
  505.      MOV     AX,CALLIP
  506.      LEA     SI,TIP      ; FORMAT IT
  507.      CALL     HEXPRT
  508.      MOV     AX,CALLCS
  509.      LEA     SI,TCS      ; FORMAT IT
  510.      CALL     HEXPRT
  511.      MOV     AH,0
  512.      MOV     AL,INTNUM   ; FORMAT INT NUMBER
  513.      LEA     SI,TCINT+3
  514.      CALL     HEXPRT
  515.      MVCLIT  TCINT,' INT ',5 ; IDENTIFY INT
  516.      MVC     TCHARS,TMASK,LCHARS ; FILL IN CONSTANT THINGS
  517. ; FILL IN DESCRIPTION FIELD
  518.      MVCLIT  TDESC,'        ' ; UNKNOWN DESCRIPTION
  519.      CMP     INTNUM,13H  ; DISKETTE?
  520.      JNE     NOTDISK
  521. ;
  522.      MVC     TCHARS,DMASK,LCHARS ; TAILOR FOR DISKETTE
  523.      MVCLIT  TDESC,'DISK I/O'
  524.      MOV     AX,CALLAX   ; TRY TO MATCH FUNCTION IN AH
  525.      LEA     SI,DSKTAB   ; TO GET DESCRIPTION
  526. LOOPDD:  CMP     AH,BYTE PTR [SI] ; MATCH?
  527.      JNE     NOMATCHD    ; NO, LOOK AT NEXT ONE
  528.      INC     SI         ; YES, POINT AT DESCRIPTION
  529.      MVC     TDESC,,8    ; MOVE IN DESC.
  530.      JMP     ENDDESC     ; LEAVE LOOP
  531. NOMATCHD: ADD     SI,LDT      ; POINT AT NEXT TABLE ENTRY
  532.      MOV     BL,0FFH     ; CHECK FOR END OF TABLE
  533.      CMP     BL,BYTE PTR [SI]
  534.      JE     END13H      ; YES, GIVE UP
  535.      JMP     LOOPDD      ; NO, KEEP LOOKING
  536. END13H:  JMP     ENDDESC
  537. ;
  538. NOTDISK: CMP     INTNUM,17H  ; PRINTER?
  539.      JNE     NOTPRNT
  540.      MVCLIT  TDESC,'PRNT I/O'
  541.      JMP     ENDDESC
  542. NOTPRNT: CMP     INTNUM,20H  ; DOS TERMINATE?
  543.      JNE     NOT20H
  544.      MVCLIT  TDESC,'DOS TERM'
  545.      JMP     ENDDESC
  546. NOT20H:  CMP     INTNUM,DOSINT    ; DOS FUNCTION?
  547.      JE     SETDOSD
  548.      JMP     NOTDOSF
  549. SETDOSD: MVCLIT  TDESC,'DOS FUNC'
  550.      MOV     AX,CALLAX   ; SHOW AX VALUE
  551.      LEA     SI,TAX
  552.      CALL     HEXPRT
  553.      MOV     AX,CALLAX   ; TRY TO MATCH FUNCTION IN AH
  554.      LEA     SI,DOSTAB   ; TO GET DESCRIPTION
  555. LOOPD:     CMP     AH,BYTE PTR [SI] ; MATCH?
  556.      JNE     NOMATCH     ; NO, LOOK AT NEXT ONE
  557.      INC     SI         ; YES, POINT AT DESCRIPTION
  558.      MVC     TDESC,,8    ; MOVE IN DESC.
  559.      JMP     DOSFMTCK    ; LEAVE LOOP
  560. NOMATCH: ADD     SI,LDT      ; POINT AT NEXT TABLE ENTRY
  561.      MOV     BL,0FFH     ; CHECK FOR END OF TABLE
  562.      CMP     BL,BYTE PTR [SI]
  563.      JE     DOSFMTCK    ; YES, GIVE UP
  564.      JMP     LOOPD         ; NO, KEEP LOOKING
  565. ;
  566. DOSFMTCK: MOV     AX,CALLAX   ; CHECK FOR SPECIAL FORMATTING
  567.      MOV     CX,LLSTASC  ; THOSE THAT HAVE ASCIIZ STRING
  568.      LEA     SI,LSTASC   ; LIST OF WINNERS
  569. ASCLOOP: CMP     AH,BYTE PTR [SI] ; MATCH?
  570.      JE     FMTASCI     ; YES, FORMAT IT
  571.      INC     SI         ; NEXT ENTRY
  572.      LOOP     ASCLOOP
  573. ;
  574.      MOV     AX,CALLAX   ; CHECK FOR SPECIAL FORMATTING
  575.      MOV     CX,LLSTFCB  ; THOSE THAT HAVE AN FCB
  576.      LEA     SI,LSTFCB   ; LIST OF WINNERS
  577. FCBLOOP: CMP     AH,BYTE PTR [SI] ; MATCH?
  578.      JNE     FCBLOPX     ; NO, CONTINUE
  579.      JMP     FMTFCB      ; YES, FORMAT IT
  580. FCBLOPX: INC     SI         ; NEXT ENTRY
  581.      LOOP     FCBLOOP
  582. ;
  583.      CMP     AH,29H      ; PARSE FILENAME?
  584.      JE     FMTPARS     ; YES, FORMAT COMMAND LINE
  585. ;
  586.      MOV     AX,CALLAX   ; CHECK FOR SPECIAL FORMATTING
  587.      MOV     CX,LLSTCDL  ; THOSE THAT HAVE CHAR IN DL
  588.      LEA     SI,LSTCDL   ; LIST OF WINNERS
  589. CDLLOOP: CMP     AH,BYTE PTR [SI] ; MATCH?
  590.      JE     FMTCDL      ; YES, FORMAT IT
  591.      INC     SI         ; NEXT ENTRY
  592.      LOOP     CDLLOOP
  593. ;
  594.      JMP     ENDDESC     ; USE DEFAULT FORMAT
  595. ;
  596. FMTCDL:  BLANKS  TTEXT,LTEXT ; BLANK OUT AREA
  597.      MOV     DX,CALLDX   ; GET THE CHARACTER
  598.      LEA     DI,TTEXT    ; WHERE IT GOES
  599.      MOV     BYTE PTR [DI],DL ; STORE THE CHARACTER
  600.      JMP     STORTRC     ; OUTPUT LINE
  601. ;
  602. FMTPARS: BLANKS  TTEXT,LTEXT ; BLANK OUT AREA
  603.      MOV     AX,CALLDS   ; SET UP DS:SI POINTER
  604.      MOV     ES,AX
  605.      MOV     SI,CALLSI
  606.      LEA     DI,TTEXT    ; WHERE TO PUT DATA
  607.      MOV     CX,LTEXT
  608. MVCPAR:  MOV     AL,BYTE PTR ES:[SI] ; GET A BYTE
  609.      MOV     BYTE PTR [DI],AL ; STORE IT
  610.      INC     SI         ; NEXT BYTE
  611.      INC     DI
  612.      LOOP     MVCPAR
  613.      JMP     STORTRC     ; ADD TO TRACE TABLE
  614. ;
  615. FMTASCI: BLANKS  TTEXT,LTEXT ; BLANK OUT AREA
  616.      MASCIIZ TTEXT,DS,DX,LTEXT ; FILL IN PLIST
  617.      JMP     STORTRC     ; ADD TO TRACE TABLE
  618. ;
  619. FMTFCB:  BLANKS  TTEXT,LTEXT ; BLANK OUT AREA
  620.      MOV     AX,CALLDS   ; SET UP DS:DX POINTER
  621.      MOV     ES,AX
  622.      MOV     SI,CALLDX
  623.      LEA     DI,TTEXT    ; WHERE TO PUT FCB
  624.      INC     SI         ; SKIP OVER DRIVE FIELD
  625.      MOV     CX,11         ; FILENAME+EXTENSION
  626. MVCFCB:  MOV     AL,BYTE PTR ES:[SI] ; GET A BYTE
  627.      MOV     BYTE PTR [DI],AL ; STORE IT
  628.      INC     SI         ; NEXT BYTE
  629.      INC     DI
  630.      LOOP     MVCFCB
  631.      JMP     STORTRC     ; ADD TO TRACE TABLE
  632. ;
  633. NOTDOSF:
  634. ;
  635. ENDDESC: MOV     AX,CALLAX
  636.      LEA     SI,TAX
  637.      CALL     HEXPRT
  638.      MOV     AX,CALLBX
  639.      LEA     SI,TBX
  640.      CALL     HEXPRT
  641.      MOV     AX,CALLCX
  642.      LEA     SI,TCX
  643.      CALL     HEXPRT
  644.      MOV     AX,CALLDX
  645.      LEA     SI,TDX
  646.      CALL     HEXPRT
  647.      MOV     AX,CALLDS
  648.      LEA     SI,TDS
  649.      CALL     HEXPRT
  650.      MOV     AX,CALLES
  651.      LEA     SI,TES
  652.      CALL     HEXPRT
  653.      MOV     AX,DS         ; MAKE ES=DS
  654.      MOV     ES,AX
  655. ;
  656.      MOV     AL,INTNUM   ; INT 21H?
  657.      CMP     AL,DOSINT
  658.      JE     TEST40H     ; YES, TEST FOR 40H(WRITE FILE/DEVICE)
  659.      JMP     STORTRC
  660. TEST40H: MOV     AX,CALLAX   ; FUNCTION 40H?
  661.      CMP     AH,40H
  662.      JE     FMT40H
  663.      JMP     STORTRC
  664. FMT40H:  MOV     AX,CALLDS   ; POINT AT DATA STRING
  665.      MOV     ES,AX
  666.      MOV     SI,CALLDX
  667.      LEA     DI,TXTWFD   ; WHERE TEXT GOES
  668.      MOV     CX,LWFD     ; LENGTH OF TEXT AREA
  669. MFMT40H: MOV     AL,BYTE PTR ES:[SI] ; GET A BYTE
  670.      MOV     BYTE PTR [DI],AL ; AND STORE IT
  671.      INC     SI
  672.      INC     DI
  673.      LOOP     MFMT40H     ; LOOP UNTIL DONE
  674. ;
  675. ; MOVE THIS ENTRY TO THE TRACE TABLE
  676. ;
  677. STORTRC: MOV     AL,TFLAG    ; ARE WE TRACING?
  678.      CMP     AL,YES      ; ...
  679.      JE     NXSTUF      ; YES, STORE IT
  680.      JMP     GOBACK      ; NO, SKIP NEXT STUFF
  681. ;
  682. NXSTUF:  MOV     AL,LASTINT  ; CHECK FOR A DUPLICATE TRACE ENTRY
  683.      CMP     AL,INTNUM
  684.      JNE     NOTDUP
  685.      CMP     AL,DOSINT   ; DOS INT?
  686.      JNE     NOTDUP
  687.      MOV     AX,LASTAX   ; DOS FUNCTION 2CH LAST TIME?
  688.      CMP     AH,2CH
  689.      JNE     NOTDUP2C
  690.      MOV     AX,CALLAX   ; SAME THING THIS TIME ALSO?
  691.      CMP     AH,2CH
  692.      JNE     NOTDUP
  693.      JMP     MARKDUP
  694. NOTDUP2C:
  695.      CMP     AH,0BH      ; CHECK INPUT LAST TIME?
  696.      JNE     NOTDUP
  697.      MOV     AX,CALLAX   ; SAME THING THIS TIME ALSO?
  698.      CMP     AH,0BH      ; CHECK INPUT LAST TIME?
  699.      JNE     NOTDUP
  700.      JMP     MARKDUP
  701. ;
  702. MARKDUP: MOV     DI,LASTPTR  ; FLAG ENTRY AS A DUPLICATE
  703.      ADD     DI,LBLIP
  704.      MOV     BYTE PTR [DI],42 ; '*'
  705.      JMP     GOBACK
  706. ;
  707. NOTDUP:  MOV     AL,INTNUM   ; REMEMBER LATEST TRACE DATA
  708.      MOV     LASTINT,AL  ; SO WE CAN COMPARE NEXT TIME
  709.      MOV     AX,CALLCS
  710.      MOV     LASTCS,AX
  711.      MOV     AX,CALLIP
  712.      MOV     LASTIP,AX
  713.      MOV     AX,CALLAX
  714.      MOV     LASTAX,AX
  715. ;
  716.      MOV     AX,DS         ; MAKE ES=DS
  717.      MOV     ES,AX         ; ...
  718.      MOV     DI,POINT    ; CURRENT PLACE IN TABLE
  719.      MOV     LASTPTR,DI  ; REMEMBER
  720.      LEA     SI,TCS      ; LATEST TRACE ENTRY
  721.      MOV     CX,LL         ; LENGTH OF AN ENTRY
  722. REP     MOVSB             ; MOVE THE STRING
  723. ; COMPUTE ADDRESS OF NEXT ENTRY
  724.      LEA     BP,ENDTRACE ; END OF TABLE
  725.      MOV     AX,POINT    ; CURRENT POINTER
  726.      ADD     AX,LL         ; NEXT POINTER
  727.      CMP     AX,BP         ; REACH END YET?
  728.      JB     MIDDLE      ; NO, STORE NEW PLACE
  729.      LEA     AX,BEGTRACE ; YES, START OVER AT TOP
  730.      MOV     BL,YES      ; SET WRAP FLAG
  731.      MOV     WRAP,BL     ; ...
  732. MIDDLE:  MOV     POINT,AX
  733. ; RESTORE REGS
  734. GOBACK:  POP     DI
  735.      POP     SI
  736.      POP     DX
  737.      POP     CX
  738.      POP     BX
  739.      POP     AX
  740.      POP     BP
  741.      POP     ES
  742.      POP     DS         ; DS NO LONGER USEABLE BY ME!
  743.      POPF             ; RESTORE CALLER FLAGS
  744. ;
  745.      PUSH     CS:OLDCS    ; NOW RETURN TO REAL EXIT
  746.      PUSH     CS:OLDIP
  747.      RET
  748. ;
  749. OLDVEC     LABEL     DWORD
  750. OLDIP     DW     ?         ; original INT IP values
  751. OLDCS     DW     ?         ; original INT CS values
  752. CALLIP     DW     ?         ; IP WE RETURN TO
  753. CALLCS     DW     ?         ; CS WE RETURN TO
  754. CALLAX     DW     ?         ; CALLER AX
  755. CALLBX     DW     ?
  756. CALLCX     DW     ?
  757. CALLDX     DW     ?
  758. CALLSI     DW     ?
  759. CALLDI     DW     ?
  760. CALLDS     DW     ?
  761. CALLES     DW     ?
  762. LASTINT  DB     0         ; LAST INT TRACED
  763. LASTCS     DW     0         ; CS FROM LAST INT TRACED
  764. LASTIP     DW     0         ; IP FROM LAST INT TRACED
  765. LASTAX     DW     0         ; AX FROM LAST INT TRACED
  766. LASTPTR  DW     0         ; ADDRESS OF LAST TRACE ENTRY
  767. DUMMY     ENDP
  768. ;
  769. ;
  770. ; Hexprt - convert binary word to 2 hex words for printing
  771. ;
  772. ; Call with:     AX = binary word
  773. ;      SI - points to a 4 byte buffer to contain result
  774. ;
  775. ; Returns   SI = SI + 4
  776. ;
  777. ; Other registers unchanged
  778. ;
  779. HEXPRT     PROC NEAR
  780.     PUSH CX   ;SAVE REGISTERS
  781.     PUSH BX
  782. ;
  783.     MOV  CX,4 ;SETUP FOR ROTATES, THRU LOOP 4 TIMES
  784.     ROR  AX,CL       ;INITIALIZE
  785. ROLL:
  786.     PUSH CX   ;SAVE LOOP COUNTER
  787.     MOV  CL,4 ;SETUP FOR SHIFTS
  788.     ROL  AX,CL       ;GET NEXT CHAR
  789.     MOV  BH,AH       ;MOVE TO BH
  790.     SHR  BH,CL       ;GET HIGH-ORDER CHAR OF THIS BYTE
  791.     POP  CX   ;RESTORE LOOP COUNTER
  792.     CMP  BH,9 ;IS IT GT 9
  793.     JG     LTR  ;YES, JUMP TO LTR
  794.     ADD  BH,048    ;MAKE IT ASCII
  795.     MOV  [SI],BH   ;STORE THIS CHAR
  796.     INC  SI
  797.     LOOP ROLL ;GET NEXT CHAR
  798.     JMP  HEXIT
  799. LTR:     ADD  BH,065    ;MAKE IT ASCII
  800.     SUB  BH,10
  801.     MOV  [SI],BH   ;STORE THIS CHAR
  802.     INC  SI
  803.     LOOP ROLL ;GET NEXT CHAR
  804. ;
  805. HEXIT:
  806.     MOV  CL,4 ;RESTORE AX
  807.     ROL  AX,CL       ; TO ORIGINAL FORM
  808.     POP  BX   ;RESTORE REGISTERS
  809.     POP  CX
  810.     RET       ;AND RETURN TO CALLER
  811. HEXPRT     ENDP
  812. ENDOFME: NOP             ; USED FOR INT 27H CALL
  813. CSEG     ENDS
  814.      END BEGCODE
  815.